package com.example.demo.controller;

import com.example.demo.common.ApplicationVariable;
import com.example.demo.common.PasswordUtils;
import com.example.demo.common.ResultAjax;
import com.example.demo.model.Userinfo;
import com.example.demo.model.UserinfoVO;
import com.example.demo.service.UesrService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UesrService uesrService;

    /**
     * 注册功能
     * @param userinfo
     * @return
     */
    @RequestMapping("/reg")
    public ResultAjax reg(Userinfo userinfo) {

        // 1.校验参数
        if (userinfo == null || !StringUtils.hasLength(userinfo.getUsername()) ||
        !StringUtils.hasLength(userinfo.getPassword())) {
            return ResultAjax.fail(-1,"非法参数");
        }
        // 对密码进行加盐处理
        userinfo.setPassword(PasswordUtils.encrypt(userinfo.getPassword()));
        // 2.请求service进行添加操作存储到数据库中
        int result = uesrService.reg(userinfo);
        // 3.将执行结果返回给前端
        return ResultAjax.succ(200,result);
    }

    /**
     * 登录接口
     * @param userinfoVO
     * @param request
     * @return
     */
    @RequestMapping("/login")
    public ResultAjax login(UserinfoVO userinfoVO, HttpServletRequest request) {
        // 1. 获取前端传过来的对象 使用扩展对象接收  +  对前端传过来的数据进行参数校验
        if (userinfoVO == null || !StringUtils.hasLength(userinfoVO.getUsername()) ||
        !StringUtils.hasLength(userinfoVO.getUsername())) {
            return ResultAjax.fail(-1,"参数错误");
        }
        // 2.根据用户名查询对象  将数据库的用户名设置唯一 
        Userinfo userinfo = uesrService.getUserByName(userinfoVO.getUsername());
        // 3. 验证输入的账号密码是否正确
        // 验证思路
        // ①用户名+密码查询用户表 查到说明账号密码对
        // ②根据用户名查询对象 --> 查询到对象 --> 用查询到的对象和传递过来的密码对比,相同则登陆成功
        // 第一个方法 无法直接拿密码和数据库的加密密码对比 局限性比较大 对密码加密可能需要对象的里的某些数据 类似密钥的东西
        // ①实现的功能②都能实现,但是②能实现的,①不一定能实现
        // 验证账号是否存在
        if (userinfo == null || userinfo.getId() <= 0) {
            // 不存在此用户 为什么不存在返回的id是负数的
//            System.out.println(result);
            return ResultAjax.fail(-2,"用户名或密码错误");

        }
        // 账户存在,验证密码是否正确  加盐解密
        if (!PasswordUtils.decrypt(userinfoVO.getPassword(),userinfo.getPassword()) ) {
            return ResultAjax.fail(-2,"用户名或密码错误");
        }
        // 4. 将登录的身份信息存储到session,登录验证
        HttpSession session = request.getSession();
        session.setAttribute(ApplicationVariable.SESSION_USERINFO_KEY,userinfo);
        // 5. 将结果返回给前端
        return ResultAjax.succ(200,1);
    }

        @RequestMapping("/logout")
        public ResultAjax logout(HttpServletRequest request) {
            // 获取session
            HttpSession session = request.getSession(false);
            if (session != null && session.getAttribute(ApplicationVariable.SESSION_USERINFO_KEY) != null) {
                session.removeAttribute(ApplicationVariable.SESSION_USERINFO_KEY);
            }
            return ResultAjax.succ(1);
        }

}
